\documentclass[10.5pt, a4paper]{article}

\usepackage{xeCJK}
\newCJKfontfamily{\heiti}[AutoFakeBold={3.17}]{SimHei}

\usepackage{geometry}
\geometry{
    left = 0.6in,
    right = 0.6in,
    top = 0.8in,
    bottom = 1.0in
}
\usepackage{amssymb,amsbsy,amsmath,xcolor,mathrsfs}
\usepackage{listings}
\usepackage{tasks}
\settasks{
    label = \Alph*. ,
    label-width = 16pt
}

\renewcommand{\title}[2]{
    \begin{center}
        \Large\heiti #1~年~#2~月 Python~三级考试
    \end{center}
}
\newcommand{\TimeAndName}[1]{
    \begin{center}
        考试时间:~#1~ 分钟 \qquad\qquad\qquad\qquad 姓名:\underline{\quad\quad\quad\quad}
    \end{center}
}

\begin{document}
    \lstset{
        language = python,
        keywordstyle = \color{orange}\bfseries,
        emph = {print,bool,chr,ord,sorted,float,type,oct,hex,abs,sum,len,int,open,list,map},
        emphstyle = \color{purple}\bfseries,
        showspaces = false,
        basicstyle = \ttfamily,
        morekeywords = {True,False}
    }

    \title{2021}{6}
    
    \TimeAndName{60}
    
    \vspace{1cm}
    {\noindent\heiti 第一部分、单选题(共 25 题,每题 2 分,共50分.)}

    \begin{enumerate}
        % 1
        \item 关于\lstinline{open()}函数的参数,下列描述正确的是?(\qquad)
        \begin{tasks}
            \task "\lstinline{w+}"以十六进制格式打开一个文件只用于写入
            \task "\lstinline{r+}"打开一个文件用于读写.文件指针将会放在文件的末尾
            \task "\lstinline{w}"打开一个文件只用于写入.如果该文件已存在则打开文件,并从原有位置开始编辑,即保留原有内容.如果该文件不存在,创建新文件
            \task "\lstinline{r}"以只读方式打开文件,文件的指针将会放在文件的开头
        \end{tasks}

        % 2
        \item 如下代码所示,请问下划线处应该填入?(\qquad)
        \begin{lstlisting}
            a = [9,3,7,5,1,8,4]
            print(a)
            # 执行到此,列表变量 a 的内容为：________1________       
            a.sort()
            print(a)
            # 执行到此,列表变量 a 的内容为：________2________
        \end{lstlisting}
        \begin{tasks}(2)
            \task 1处没有变化；2处没有变化
            \task 1处没有变化；2处顺序会有变化
            \task 1处顺序会有变化；2处顺序会有变化
            \task 1处顺序会有变化；2处没有变化
        \end{tasks}

        % 3
        \item 下面不同数制数据中,数值最大的是?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{0x2B}
            \task \lstinline{0o37}
            \task \lstinline{41}
            \task \lstinline{0b100111}
        \end{tasks}

        % 4
        \item 执行代码\lstinline{print(bool(2)+3)}打印出的结果为?(\qquad)
        \begin{tasks}(4)
            \task 3
            \task 4
            \task 5
            \task 报错
        \end{tasks}

        % 5
        \item 求既是 3 的倍数且各个位上的数的和是 8 的倍数的三位数,适合的算法是?(\qquad)
        \begin{tasks}(4)
            \task 解析算法
            \task 枚举算法
            \task 排序算法
            \task 对分查找法
        \end{tasks}

        % 6
        \item 下列选项不是 Python 异常处理可能用到的关键字?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{try}
            \task \lstinline{else}
            \task \lstinline{if}
            \task \lstinline{finally}
        \end{tasks}

        % 7
        \item 已定义学期末考核科目~\lstinline{km=["语文","数学","英语]},先根据安排需要添加综合学科进入考试科目,操作正确的是?(\qquad)
        \begin{tasks}(2)
            \task \lstinline{km.append("综合")}
            \task \lstinline{km.insert("综合")}
            \task \lstinline{km.write("综合")}
            \task \lstinline{km.read("综合")}
        \end{tasks}

        % 8
        \item 表达式~\lstinline{chr(ord("0")+3)}~的结果是?(\qquad)
        \begin{tasks}(4)
            \task 333
            \task '3'
            \task "000"
            \task "0","0","0"
        \end{tasks}

        % 9
        \item 与十进制数 1770 对应的八进制数是?(\qquad)
        \begin{tasks}(4)
            \task 3350
            \task 3351
            \task 3352
            \task 3540
        \end{tasks}

        % 10
        \item 下面代码的输出结果是?(\qquad)
        \begin{lstlisting}
            a = [5,1,3,4]
            print(sorted(a, reverse=True))
        \end{lstlisting}
        \begin{tasks}(4)
            \task \lstinline{[5,1,3,4]}
            \task \lstinline{[5,4,3,1]}
            \task \lstinline{[4,3,1,5]}
            \task \lstinline{[1,3,4,5]}
        \end{tasks}

        % 11
        \item 用冒泡排序算法对 6 个数进行排序,进行比较的次数为?(\qquad)
        \begin{tasks}(4)
            \task 4
            \task 5
            \task 10
            \task 15
        \end{tasks}

        % 12
        \item 以下代码执行后,如果用户输入为:~\lstinline{3*6}~,则输出为?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{3*6}
            \task \lstinline{"3*6"}
            \task \lstinline{18}
            \task \lstinline{"18"}
        \end{tasks}

        % 13
        \item 关于 Python 函数的描述,正确的是?(\qquad)
        \begin{tasks}(2)
            \task 表达式\lstinline{float("3.14")}的结果是3.14
            \task 表达式\lstinline{type(100)}的结果是十进制数
            \task 表达式\lstinline{oct(100)}可以获得十六进制数
            \task 表达式\lstinline{hex(100)}可以获得八进制数
        \end{tasks}

        % 14
        \item Python中~\lstinline{abs()}~函数的作用为?(\qquad)
        \begin{tasks}(4)
            \task 求绝对值
            \task 求开方结果
            \task 求平方结果
            \task 求立方结果
        \end{tasks}
        
        % 15
        \item 以下代码的执行结果为?(\qquad)
        \begin{lstlisting}
            t = (11,25,36)
            avg = sum(t)/len(t)
            print(avg)
        \end{lstlisting}
        \begin{tasks}(4)
            \task 24
            \task 24.0
            \task 12
            \task 12.0
        \end{tasks}

        % 16
        \item Python 中十六进制与十进制进行转换时,下列表述错误的是?(\qquad)
        \begin{tasks}
            \task 十进制数57转换成十六进制,可以表示成\lstinline{int('57',16)}
            \task 十进制数57转换成十六进制,可以表示成\lstinline{hex(57)}
            \task 十六进制数39转换成十进制,可以表示成\lstinline{int(39,16)}
            \task 十六进制数39转换成十进制,可以表示成\lstinline{0x39}
        \end{tasks}

        % 17
        \item Python中使用\lstinline{open()}函数打开文件完成读的功能,下列说法错误的是?(\qquad)
        \begin{tasks}
            \task \lstinline{readlines()}方法是读取文本所有的行直到文件末尾
            \task \lstinline{readline()}方法是读取文件的第一行
            \task 在同一个程序中,多次使用\lstinline{readline()}方法后,程序仍读取第一行的内容
            \task 执行\lstinline{readline()}方法后,运行的结果不是列表,而是字符串
        \end{tasks}

        % 18
        \item 以下代码执行后,得到的结果为?(\qquad)
        \begin{lstlisting}
            list1 = [5,0,6,1,2,7,3,4]
            print(sorted(list1, reverse=True))
        \end{lstlisting}
        \begin{tasks}(2)
            \task \lstinline{[7,6,5,4,3,2,1,0]}
            \task \lstinline{[0,1,2,3,4,5,6,7]}
            \task \lstinline{[4,3,7,2,1,6,0,5]}
            \task \lstinline{[5,0,6,1,2,7,3,4]}
        \end{tasks}

        % 19
        \item \lstinline{int(7.8)}的执行结果是?(\qquad)
        \begin{tasks}(4)
            \task 8
            \task 8.0
            \task 7
            \task 7.0
        \end{tasks}

        % 20
        \item 关于查找的说法,下列说法正确的是?(\qquad)
        \begin{tasks}(2)
            \task 顺序查找属于无序查找
            \task 对分查找一定能找到数据
            \task 对分查找是一种低效的查找方法
            \task 顺序查找次数一定比对分查找次数多
        \end{tasks}

        % 21
        \item 当\lstinline{try}子句中没有任何错误时,一定不会执行语句?(\qquad)
        \begin{tasks}(4)
            \task \lstinline{try}
            \task \lstinline{else}
            \task \lstinline{except}
            \task \lstinline{finally}
        \end{tasks}

        % 22
        \item Python可以通过哪个函数实现字符串数据的格式化处理?(\qquad)
        \begin{tasks}(4)
            \task format
            \task int
            \task max
            \task str
        \end{tasks}

        % 23
        \item 以下代码的输出结果是?(\qquad)
        \begin{lstlisting}
            ls = []
            for m in '想念':
                for n in '家人':
                    ls.append(m+n)
            print(ls)
        \end{lstlisting}
        \begin{tasks}(2)
            \task 想念家人
            \task 想想念念家家人人
            \task 想家想人念家念人
            \task \lstinline{['想家','想人','念家','念人']}
        \end{tasks}

        % 24
        \item \lstinline{format}方法通常用来格式化\lstinline{print}的输出格式.以下程序中使用\lstinline{format}来输出:
        
        我叫小明,我今年12岁了,则代码中缺失部分应该填写?(\qquad)
        \begin{lstlisting}
            name = "小明"
            age = 12
            print("我叫{},我今年{}岁了".format(_____________))
        \end{lstlisting}
        \begin{tasks}(2)
            \task \lstinline{age,name}
            \task \lstinline{namge,age}
            \task \lstinline{namge:age}
            \task \lstinline{age name}
        \end{tasks}

        % 25
        \item 下列数据中,不可能表示十六进制数的是?(\qquad)
        \begin{tasks}(4)
            \task ABC
            \task 17F
            \task 8H5
            \task 9a01
        \end{tasks}
    \end{enumerate}

    \vspace{1cm}
    {\noindent\heiti 第二部分、判断题(共 10 题,每题 2 分,共20分.)}
    \begin{enumerate}
        \setcounter{enumi}{25}
        \item \lstinline{except}语句可以有多个,Python会按\lstinline{except}语句的顺序依次匹配你指定的异常.(\qquad)
        \item \lstinline{any([])}函数和\lstinline{any(())}函数的结果是\lstinline{False}.(\qquad)
        \item 利用Python3自带的csv库进行操作,可使用以下程序获取 class.csv文件中存储的表头信息,并进行输出.(\qquad)
        \begin{lstlisting}
            import csv
            with open('class. csv')as f:
                reader=csv.reader(f)
                head_row=next(reader)
                print(head_row)
        \end{lstlisting}
        \item 利用csv格式存储二维数据时,每行都是一个一维数据,用逗号分隔,可以有空行.(\qquad)
        \item 数学老师对小明说:我要计算\lstinline{[4,6,3,2,5,8,7,9]}整数的平方,你能帮我编程实现吗?
        
        小明说:两行代码就能实现。程序如下!
        
        请判断,小明的这个程序是否正确.(\qquad)
        \begin{lstlisting}
            a = [4,6,3,2,5,8,7,9]
            print(list(map(lambda x: x**2, a)))
        \end{lstlisting}
        \item 多次使用\lstinline{breadline()}读取文件,如果要退到文件的起始位置,可以使用\lstinline{seek()}实现(\qquad)
        \item Python中使用\lstinline{print()}函数输出时,输出完毕默认会换行,不能通过修改参数改为其它间隔方式.(\qquad)
        \item 十六进制与八进制数值之间的转换,常常借助二进制或者十进制作为中间的桥梁.(\qquad)
        \item 同一个整数分别用十六进制和八进制表示后,数值一定不相等.(\qquad)
        \item 语句\lstinline{print("a","b","c"sep=",")}的输出结果是:\lstinline{"a""b""c"}.(\qquad)
    \end{enumerate}

    \newpage
    {\noindent\heiti 第三部分、编程题(共 3 题,每题 10 分,共30分.)}
    \begin{enumerate}
        \setcounter{enumi}{35}
        
        \item 法定节假日是根据各国、各名族的风俗习惯或纪念要求,由国家法律统一规定的用以进行庆祝及度假的休息时间.法定节假日制度是国家政治、经济、文化制度的重要反映,涉及经济社会的多个方面,涉及广大人民群众的切身利益.法定节假日的休假安排,为居民出行购物和休闲提供了时间上的便利,为拉动内需、促进经济增长做出了积极贡献。
        
        给出一个2020年的节假日的放假日期csv文件(vacations.csv),内容示例如下
        \begin{lstlisting}
            序号,节日,开始月日,结束月日
            1,元旦,1230,0101
            2,春节0215,0221
            3,清明节,0405,0407
            4,劳动节,0501,0503
            5,端午节,0616,0618
            6,中秋节,0922,0924
            7,国庆节,1001,1007
        \end{lstlisting}

        以第1行为例,1230表示12月30日,0101表示1月1日.

        代码功能为:读入csv文件中数据,获得用户输入.根据用户输入的节假日名称,输出此节假日的假期范围.请补全代码.
        \begin{lstlisting}
            fi = open("/data/____1____","r")
            ls = []
            for line in fi:
                ls.append(line.strip("\n").split(","))
            fi.close()
            s = input("请输入节假日名称:")
            for line in ls:
            if ____2____:
                print("{}的假期位于{}-{}之间".format(line[1],line[2],line[3]))
        \end{lstlisting}

        \vfill

        \item 尊老王国有一个默认规则,排队必须遵守年长的在前,年幼的在后.一支正要出城的队伍,请帮助他们顺利出城.
        {\heiti 输入:} 15、78、96、45、36

        {\heiti 输出:}
        \begin{lstlisting}
            [96,78,45,36,15]
            [3,2,4,5,1]
        \end{lstlisting}

        请在划线处补全代码,实现以上功能
        \begin{lstlisting}
            s = input()
            x = s.split("、")
            a = []
            b = []
            n = 0
            for i in range(0, len(x)):
                a.append(int(x[i]))
                n = ____1____
                b.append(n)
            for i in range(n-1):
                for j in range(i+1,n):
                    if ____2____:
                        _____3_____
                        b[i],b[j]=b[j],b[i]
            print(a)
            print(b)
        \end{lstlisting}

        \newpage
        \item 有$n$个人围成一个圈,顺序报号.从第一个人开始数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位.
        \begin{lstlisting}
            n = int(input("请输入总人数:"))
            num = []
            for i in range(n):
                num.append(____1____)
            i = 0
            k = 0
            m = 0
            while m < n-1:
                if ____2____:
                    k += 1
                if k == 3:
                    num[i] = 0
                    k = 0
                    ____3____
                i += 1
                if i == n:
                    i = 0
            i = 0
            while num[i] == 0:
                i += 1
            print(____4____)
        \end{lstlisting}
    \end{enumerate}

    \newpage
    \begin{center}
        \Huge \heiti 参考答案
    \end{center}

        \begin{tasks}[label=\arabic*.](5)
            \task D %1
            \task B %2
            \task A %3
            \task B %4
            \task B %5

            \task C
            \task A
            \task B
            \task C
            \task B

            \task D
            \task C
            \task A
            \task A
            \task B

            \task A
            \task C
            \task A
            \task C
            \task A

            \task C
            \task A
            \task D
            \task B
            \task C

            \task $\checkmark$
            \task $\checkmark$
            \task $\checkmark$
            \task $\times$
            \task $\checkmark$

            \task $\checkmark$
            \task $\times$
            \task $\checkmark$
            \task $\times$
            \task $\times$
        \end{tasks}

        \begin{enumerate}
            \setcounter{enumi}{35}
            \item \begin{lstlisting}
                vacations.csv #1
                s == line[1] #2
            \end{lstlisting}

            \item \begin{lstlisting}
                i + 1 #1
                a[i] < a[j] #2
                a[i],a[j] = a[j],a[i] #3
            \end{lstlisting}

            \item \begin{lstlisting}
                n+1 #1
                num[i] == 1 #2
                m += 1 #3
                num[i] #4
            \end{lstlisting}
        \end{enumerate}
\end{document}